#ifndef __SAL_CONFIGURATION_H__
#define __SAL_CONFIGURATION_H__

/*********************************************************************
 * INCLUDES
 */

#ifdef __cplusplus
extern "C" {
#endif


/*********************************************************************
 *  EXTERNAL VARIABLES
 */

/*********************************************************************
 * MACROS
 */

/*********************************************************************
 * TYPES
 */

enum _cfg_storage_format
{
    CFG_FMT_INI,
    CFG_FMT_BIN,
};

enum _cfg_storage_mode
{
    CFG_MODE_FILE,
    CFG_MODE_FLASH,
};

typedef void *cfgObjId_t;
typedef void *cfgBlockId_t;

/*********************************************************************
 * FUNCTIONS
 */

/**
 *   @Description: 模块安装
 *   @param : NA
 *   @return: _OK/_ERR
 */
int32_t CFG_Install(void);

/**
 *   @Description: 模块卸载
 *   @param : NA
 *   @return: _OK/_ERR
 */
int32_t CFG_Uninstall(void);

/**
 *   @Description: 创建参数配置存储object
 *   @param : uiAddr - flash地址，uiAddr不为0则表示使用Flash存储
 *   @param : pFile - 文件名，uiAddr为0时有效
 *   @param : iFormat - 存储格式_cfg_storage_format
 *   @return: cfgObjId_t
 */
cfgObjId_t CFG_ObjectNew(uint32_t uiAddr, const char *pFile, int32_t iFormat);

/**
 *   @Description: 删除参数配置存储object
 *   @param : pCfgObj - CFG_ObjectNew函数返回的存储Object
 *   @return: _OK/_ERR
 */
int32_t CFG_ObjectDelete(cfgObjId_t pCfgObj);

#if (SAL_CFG_INI == _ENABLE)

/**
 *   @Description: 读取ini格式参数配置
 *   @param : pCfgObj - CFG_ObjectNew函数返回的存储Object
 *   @param : pSection - ini文件section
 *   @param : pKey - ini文件关键字
 *   @param : pValue - 读取的数据缓存
 *   @param : uiSize - 缓存大小
 *   @return: _OK/_ERR
 */
int32_t CFG_IniRead(cfgObjId_t pCfgObj, const char *pSection, const char *pKey, char *pValue, uint32_t uiSize);

/**
 *   @Description: 写入ini格式参数配置
 *   @param : pCfgObj - CFG_ObjectNew函数返回的存储Object
 *   @param : pSection - ini文件section
 *   @param : pKey - ini文件关键字
 *   @param : pValue - 写入的数据
 *   @return: _OK/_ERR
 */
int32_t CFG_IniWrite(cfgObjId_t pCfgObj, const char *pSection, const char *pKey, const char *pValue);

#endif //(SAL_CFG_INI == _ENABLE)

#if (SAL_CFG_BIN == _ENABLE)

/**
 *   @Description: 创建二进制存储Block，Block是Object下属单位
 *   @param : pCfgObj - CFG_ObjectNew函数返回的存储Object
 *   @param : uiAddr - Flash初始地址
 *   @param : uiSize - 存储空间大小
 *   @return: cfgBlockId_t
 */
cfgBlockId_t CFG_BinBlockNew(cfgObjId_t pCfgObj, uint32_t uiAddr, uint32_t uiSize);

/**
 *   @Description: 删除二进制存储Block，Block是Object下属单位
 *   @param : pCfgBlock - CFG_BinBlockNew函数返回值
 *   @return: _OK/_ERR
 */
int32_t CFG_BinBlockDelete(cfgBlockId_t pCfgBlock);

/**
 *   @Description: 读取二进制存储Block数据
 *   @param : pCfgBlock - CFG_BinBlockNew函数返回值
 *   @param : pData - 读取的数据缓存
 *   @param : uiSize - 缓存大小
 *   @return: _OK/_ERR
 */
int32_t CFG_BinRead(cfgBlockId_t pCfgBlock, uint8_t *pData, uint32_t uiSize);

/**
 *   @Description: 写入二进制存储Block数据
 *   @param : pCfgBlock - CFG_BinBlockNew函数返回值
 *   @param : pData - 写入的数据
 *   @param : uiSize - 写入的数据大小
 *   @return: _OK/_ERR
 */
int32_t CFG_BinWrite(cfgBlockId_t pCfgBlock, uint8_t *pData, uint32_t uiSize);

#endif  //(SAL_CFG_BIN == _ENABLE)

#ifdef __cplusplus
}
#endif /* end of __cplusplus */

#endif

/************************************** The End Of File **************************************/

